'''
Created on 06/10/2013

@author: daniel
'''
import unittest
import hashTableAbierto

    
class MapeadorDeContrasenias(hashTableAbierto.HashTableAbierto):
    '''
    Clase concreta que hereda de HashTableAbierto e implementa 
    la estrategia de dispersion
    '''
    def __init__(self):
        '''
        El mapeador es una hashtable de N=23
        '''
        hashTableAbierto.HashTableAbierto.__init__(self, 23)
            
    def getHashEntry(self,user, passwd):
        '''
        La estrategia de dispersion proporcionada en la practica
        '''
        hAsh = 5381
        for c in user:
            hAsh = (hAsh * 7) + ord(c)
        for c in passwd:
            hAsh = (hAsh * 7) + ord(c)
        return hAsh % 23

    
    def hashAdd(self,*elem):
        '''
        Con los nuevos elementos se pueden colisionar con el metodo collisAt
        '''
        self.__collisAt__(
              self.getHashEntry(elem[0],elem[1])
              , elem[0])

    
    def hashChk(self,*elem):
        '''
        explora el indice buscando, si hay colisiones, retorna si se incluye 
        en la lista o no
        '''
        i=self.getHashEntry(elem[0],elem[1])           
        local=self.noCollitions(i)
        if(local==True):return False
        if(local==False):return self.__tabl__[i].incluye(elem)
        if(elem[0]==local):return True
        return False


class Test(unittest.TestCase):


    def testInit(self):
        self.assertIsInstance(
              MapeadorDeContrasenias(), 
              MapeadorDeContrasenias, 
              "Verifica la correcta creacion")

    def testGetHashEntry(self):
        first=MapeadorDeContrasenias()
#         print first.getHashEntry("user", "passwd")
        self.assertEquals(first.getHashEntry("user", "passwd"),19, "Verifica algunas devoluciones correctas")
#         print first.getHashEntry("complejidad", "temporal")
        self.assertEquals(first.getHashEntry("complejidad", "temporal"),6, "Verifica algunas devoluciones correctas")
#         print first.getHashEntry("Daniel", "Rosatto")
        self.assertEquals(first.getHashEntry("Daniel", "Rosatto"),4, "Verifica algunas devoluciones correctas")

    def testHashAdd(self):
        obj=MapeadorDeContrasenias()
        obj.hashAdd("elem","ContrasENia")
        self.assertNotEquals(obj.__tabl__[obj.getHashEntry("elem","Contra")],"elem", "Verifica correcto inacceso al elem")
        self.assertEquals(obj.__tabl__[obj.getHashEntry("elem","ContrasENia")],"elem", "Verifica correcto acceso al elem")
        
    def testHashChk(self):
        obj=MapeadorDeContrasenias()
        obj.hashAdd("elemento","ContrasENia")
        self.assertFalse(obj.hashChk("selfelem","ContrasENia"), "Verifica selfelem no ingresado")
        self.assertTrue(obj.hashChk("elemento","ContrasENia"), "Verifica elemento ingresado")
        self.assertFalse(obj.hashChk("selfelem","otraContrasENia"), "Verifica selfelem no ingresado")
        self.assertFalse(obj.hashChk("elemento","otraContrasENia"), "Verifica selfelem no ingresado")


if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()